/*
Problem Description
HDU 2006'10 ACM contest的颁奖晚会隆重开始了！
为了活跃气氛，组织者举行了一个别开生面、奖品丰厚的抽奖活动，这个活动的具体要求是这样的：

首先，所有参加晚会的人员都将一张写有自己名字的字条放入抽奖箱中；
然后，待所有字条加入完毕，每人从箱中取一个字条；
最后，如果取得的字条上写的就是自己的名字，那么“恭喜你，中奖了！”

大家可以想象一下当时的气氛之热烈，毕竟中奖者的奖品是大家梦寐以求的Twins签名照呀！不过，正如所有试图设计的喜剧往往以悲剧结尾，这次抽奖活动最后竟然没有一个人中奖！

我的神、上帝以及老天爷呀，怎么会这样呢？

不过，先不要激动，现在问题来了，你能计算一下发生这种情况的概率吗？

不会算？难道你也想以悲剧结尾？！
Input
输入数据的第一行是一个整数C,表示测试实例的个数，然后是C 行数据，每行包含一个整数n(1<n<=20),表示参加抽奖的人数。

Output
对于每个测试实例，请输出发生这种情况的百分比，每个实例的输出占一行, 结果保留两位小数(四舍五入)，具体格式请参照sample output。

Sample Input
1
2
Sample Output
50.00%
---------------------------------------------------------------------
思路：
N张字条的所有可能排列自然是N!（分母）。
现在的问题就是求N张字条的错排数f(N)（分子）。
首先我们考虑，如果前面N-1个人拿的都不是自己的票，即前N-1个人满足错排，现在又来了一个人，
他手里拿的是自己的票。只要他把自己的票与其他N-1个人中的任意一个交换，就可以满足N个人的错排。
这时有(N-1)*f(N-1)种方法。
我们考虑，如果前N-1个人不满足错排，而第N个人把自己的票与其中一个人交换后恰好满足错排。
这种情况发生在原先N-1人中，N-2个人满足错排，有且仅有一个人拿的是自己的票，
而第N个人恰好与他做了交换，这时候就满足了错排。
又因为前N-1个人中，每个人都有机会拿着自己的票。所以有N-1种交换的可能。故这时有(N-1)*f(N-2)种方法。
综上所述：f(N)=(N-1)*[f(N-1)+f(N-2)] 
 */
package com.yuan.algorithms.training20150719;

import java.util.Scanner;

public class 没人中奖的概率 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		long[] arr = new long[21];
		arr[1] = 0;arr[2] = 1;
		for (int i = 3; i < arr.length; i++) {
			arr[i] = (i-1)*(arr[i-1] + arr[i-2]);
		}
		while(sc.hasNext()) {
			int n = sc.nextInt();
			while(--n>=0) {
				int k = sc.nextInt();
				long sum = 1;
				//全部组合
				for (int i = 2; i <= k; i++) {
					sum *= i;
				}
				double p = (double)arr[k]/(double)sum*100.0;
				System.out.printf("%.2f%%",p);
				System.out.println();
			}
		}
	}

}
